
# CRC-16-MODBUS
def calculate_crc16(data: bytes) -> int:
    # 初始化crc为0xFFFF
    crc = 0xFFFF

    # 循环处理每个数据字节
    for byte in data:
        # 将每个数据字节与crc进行异或操作
        crc ^= byte

        # 对crc的每一位进行处理
        for _ in range(8):
            # 如果最低位为1，则右移一位并执行异或0xA001操作(即0x8005按位颠倒后的结果)
            if crc & 0x0001:
                crc = (crc >> 1) ^ 0xA001
            # 如果最低位为0，则仅将crc右移一位
            else:
                crc = crc >> 1

    # 返回最终的crc值
    return crc


if __name__ == '__main__':

    # 测试数据
    # test_data = bytes.fromhex("31 32 33")
    # test_data = bytes("Hello, world!", encoding='utf-8')
    # test_data = bytearray([0x09, 0x03, 0xFF, 0x00, 0x00, 0x01, 0x23, 0x45, 0x67])
    # test_data = bytearray([0x08,0x31,0x4C,0x42,0x30,0x30,0x30,0x31])
    data = [0xaa, 0x08,0x31,0x4C,0x42,0x30,0x30,0x30,0x31]
    test_data = []
    for i in range(1,len(data)):
        print('i=',i)
        test_data.append(data[i])
    # 计算CRC-16校验码
    crc16 = calculate_crc16(test_data)

    # 输出校验码值
    print(f'CRC-16校验码值为: 0x{crc16:04X}')
